package com.zhu.instructions.stack;

// instructions/stack/DUP_X1.java
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.OperandStack;
import com.zhu.rtda.Slot;

/**
 * 指令：dup_x1
 *
 * 操作数：无
 *
 * 功能：
 *  复制栈顶的单个变量，并将其插入到栈顶以下 1 个变量之下。
 *
 * 栈变化：
 *  ..., w, v → ..., v, w, v
 *
 * 说明：
 *  - 弹出 v 和 w
 *  - 压入顺序：v, w, v
 *
 * 限制：
 *  - v 和 w 都必须是占用一个 slot 的类型（如 int, float, ref）
 *
 * 示例用途：
 *  某些复杂表达式求值中需要保留中间结果。
 */
public class DUP_X1 extends NoOperandsInstruction {
    @Override
    public void execute(Frame frame) {
        OperandStack stack = frame.getOperandStack();
        Slot slot1 = stack.popSlot();  // v（栈顶）
        Slot slot2 = stack.popSlot();  // w（次栈顶）

        // 按顺序压回：v, w, v
        stack.pushSlot(slot1);         // v（dup 复制值）
        stack.pushSlot(slot2);         // w
        stack.pushSlot(slot1);         // v（原值）
    }
}